096927 ランダム
 HOME | DIARY | PROFILE 【フォローする】 【ログイン】

The Quiet Sound of Water

The Quiet Sound of Water

Socket通信(サーバー側)

●Socket通信

最小限の通信Serverクラス:

import java.net.Socket;
import java.net.ServerSocket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.IOException;

/* ==== Socek通信クラス ============================================= */
public class MRCommun {
private static final int MAX_CONNECTION = 256;
private static MRCommun me;
private static MRAccessPort prt;
private static MRConnection[] con = new MRConnection[MAX_CONNECTION];

/* MRCommunクラスはSingletonなのでコンストラクタ呼び出しを禁止する
使用時はgetInstanceを実行してクラスを取得する */
private MRCommun() {}
public static MRCommun getInstance(){
if (me == null){
me = new MRCommun();
}
return (me);
}

/* Socket通信の開始
port = 接続受付用ポート */
public static void StartConnection(int port) {
prt = new MRAccessPort(port);
prt.OpenPort(port);
}

/* Socketのクローズ
id = クローズするMRConnectionのID */
public static void CloseConnection(int id) {
con[id] = null;
}

/* 全クライアントへの通知 */
public static int SayAll() {
return (1);
}

/* クライアントへの通知 */
public static void ChatMsg(int id, String msg) {
for (int i=0;i 0){
if (’%’ == line.charAt(0)){
/* %% is SystemProtocol */

}else{
/* ** is Shaut */
MRCommun.ChatMsg(id, line);
}
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null) {
socket.close();
}
} catch (IOException e) {}
MRCommun.CloseConnection(id);
System.out.println("切断されました "
+ socket.getPort());
}
}

/* 接続状態の取得 */
public boolean ConnectionState(){
if (socket == null){
return (false);
}else{
return (true);
}
}
}

仕組みはシンプルだ。
まずServerSocketクラスを作成してacceptする。これにより指定したポートへの接続要求を受け付けることができる。
接続要求が来たらacceptは通信用のSocketを作成して返すので、通信用のクラスにsocketを渡してやる。
通信用のクラスは別スレッドで動くようになっている。
入出力用にBufferedReaderとPrintWriterを持っていて、この二つのクラスはSocketのI/Oにバインドしておく。
入力ストリームのreadLineによってクライアントからの通信を受け取る。
サーバーからクライアントへの通信は出力ストリームのprintlnを使用するだけ。


© Rakuten Group, Inc.